package $1_1basic;

/**
 * 
 * @author Sean
 *
 */

public class CharString {

	public static void main(String[] args) {
		// 字符类型char是基本数据类型，它是character的缩写。一个char保存一个Unicode字符：
		char c1 = 'A';
		char c2 = '中';
		/*
		 * 因为Java在内存中总是使用Unicode表示字符，所以，一个英文字符和一个中文字符都用一个char类型表示，它们都占用两个字节。
		 * 要显示一个字符的Unicode编码，只需将char类型直接赋值给int类型即可
		 */
		int n1 = 'A';
		int n2 = '中';

		System.out.println("n1=" + n1); // 字母“A”的Unicodde编码是65
		System.out.println("n2=" + n2); // 汉字“中”的Unicode编码是20013

		// 还可以直接用转义字符编码来表示一个字符,
		// 注意是十六进制:
		char c3 = '\u0041'; // 'A'，因为十六进制0041 = 十进制65
		char c4 = '\u4e2d'; // '中'，因为十六进制4e2d = 十进制20013
		System.out.println("c3=" + c3); // 'A'
		System.out.println("c4=" + c4); // '中'

		// 字符串类型
		// 字符串类型String是引用类型，我们用双引号"..."表示字符串。一个字符串可以存储0个到任意个字符

		/*
		 * 常见的转义字符包括： \" 表示字符" \' 表示字符' \\ 表示字符\ \n 表示换行符 \r 表示回车符 \t 表示Tab \\u####
		 * 表示一个Unicode编码的字符，实际把+u改成u
		 */
		String s = "ABC\n\u4e2d\u6587";
		System.out.println(s); // 包含6个字符: A, B, C, 换行符, 中, 文

		// 字符串连接
		// Java的编译器对字符串做了特殊照顾，可以使用+连接任意字符串和其他数据类型，这样极大地方便了字符串的处理。
		// 如果用+连接字符串和其他数据类型，会将其他数据类型先自动转型为字符串，再连接
		String s1 = "Hello";
		String s2 = "world";
		int age = 23;
		String s3 = age + " " + s1 + " " + s2 + "!"; // 23 Hello world!
		System.out.println(s3);

		// 多行字符串
		// 如果我们要表示多行字符串，使用+号连接会非常不方便
		// 从Java 13开始，字符串可以用"""..."""表示多行字符串（Text Blocks）了。
		// 尴尬了，这个项目一开始使用的是1.8，在这个位置报错，需要改成java 15了。继续
		String s4 = """
				SELECT * FROM
				  users
				WHERE id > 100
				ORDER BY name DESC
				""";
		System.out.println(s4);
		
		// 请将下面一组int值视为字符的Unicode码，把它们拼成一个字符串：
		int a = 72;
        int b = 105;
        int c = 65281;
        // FIXME:
        String s5 = "\\u0" +a +"\\u0" + b +"\\u0" + c;
        System.out.println("s5="+s5);
        
        

        System.out.println(Integer.toHexString(a));
        System.out.println(Integer.toHexString(b));
        System.out.println(Integer.toHexString(c));
        
        String unia = unicodestr(Integer.toHexString(a));
        System.out.println("unia="+unia);
        String unib = unicodestr(Integer.toHexString(b));
        System.out.println("unib="+unib);
        String unic = unicodestr(Integer.toHexString(c));
        System.out.println("unic="+unic);
        
		StringBuffer unicode = new StringBuffer();
		
		unicode.append(unia);
		unicode.append(unib);
		unicode.append(unic);
        
        System.out.println("s5="+unicode.toString());
        System.out.println("s5="+unicode.toString());
        
        String s6 = ""+(char)a + (char)b + (char)c;
        System.out.println("s6="+s6); //Hi！
	}

	private static String unicodestr(String x) {
        if (x.length() <= 2) {
            x = "\\u00" + x;
        } else {
            x = "\\u" + x;
        }
        System.err.println("unicode码" + x);
		return x;
	}
	
}
